import JSZip from 'jszip';
import { saveAs } from 'file-saver';
import moment from 'moment';

/**
 * @param {string} imgUrl  远程图片地址（必须同域或 CORS 允许）
 * @param {string} fileName  想要保存的文件名（含扩展名）
 */
export const downloadImage = (imgUrl: string, fileName?: string) => {
  fetch(imgUrl, { mode: 'cors' })
    .then((res: any) => {
      if (!res.ok) throw new Error('network error');
      return res.blob();
    })
    .then((blob: any) => {
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = fileName || `${Date.now()}image.jpg`;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
    })
    .catch(console.error);
};

/**
 * 把多个图片URL打包成压缩包下载
 * @param {Array} imageUrls - 图片URL数组
 * @param {String} zipName - 压缩包名称，默认"images.zip"
 */
export const packImagesToZip = async (imageUrls: any, zipName?: any) => {
  const zip = new JSZip();
  // 遍历URL数组，加载并添加图片到压缩包
  for (const [index, url] of imageUrls.entries()) {
    try {
      // 加载图片并转为Blob（需处理跨域，确保图片服务器允许跨域）
      const response = await fetch(url, { mode: 'cors' });
      if (!response.ok) throw new Error(`图片加载失败: ${url}`);
      const blob = await response.blob();
      // 提取图片后缀，生成压缩包内文件名（如image_1.jpg）
      const ext = url.split('.').pop() || 'png';
      const fileName = `image_${index + 1}.${ext}`;
      zip.file(fileName, blob);
    } catch (error: any) {
      console.error(`处理图片${url}出错:`, error);
    }
  }
  const zName = zipName || `${Date.now()}image.zip`;
  // 生成压缩包并触发下载
  const zipBlob = await zip.generateAsync({ type: 'blob' });
  saveAs(zipBlob, zName);
};

//获取图片信息
export const getImageInfoByUrl = (imageUrl: string) => {
  return new Promise((resolve, reject) => {
    if (!imageUrl) resolve('');
    const img = new Image(); // 创建图片对象
    // 图片加载完成后执行
    img.onload = function () {
      resolve(this); // 返回图片高度（单位：px）
    };
    // 图片加载失败时执行
    img.onerror = function () {
      resolve('');
    };
    // 设置图片 URL 开始加载
    img.src = imageUrl;
  });
};

/**
 * 复制图片到剪贴板
 * @param {string} imageUrl - 图片URL（支持同域或允许跨域的图片）
 * @returns {Promise<void>} - 成功/失败的Promise
 */
export const copyImageToClipboard = async (imageUrl: string) => {
  try {
    // 1. 创建Image对象加载图片
    const img = new Image();
    // 允许跨域（服务器需配置Access-Control-Allow-Origin）
    img.crossOrigin = 'anonymous';
    // 等待图片加载完成
    await new Promise((resolve, reject) => {
      img.onload = resolve;
      img.onerror = () => reject(new Error('图片加载失败'));
      img.src = imageUrl;
    });
    // 2. 创建Canvas并绘制图片
    const canvas = document.createElement('canvas');
    const ctx: any = canvas.getContext('2d');
    // 设置Canvas尺寸与图片一致
    canvas.width = img.width;
    canvas.height = img.height;
    // 绘制图片到Canvas
    ctx.drawImage(img, 0, 0);
    // 3. 将Canvas内容转为Blob（默认PNG格式）
    const blob: any = await new Promise((resolve) => {
      canvas.toBlob(resolve, 'image/png'); // 可改为'image/jpeg'等格式
    });
    if (!blob) {
      throw new Error('图片转换为Blob失败');
    }
    // 4. 复制Blob到剪贴板
    await navigator.clipboard.write([
      new ClipboardItem({
        [blob.type]: blob, // 以Blob的MIME类型作为键
      }),
    ]);

    console.log('图片复制成功');
  } catch (error: any) {
    console.error('图片复制失败：', error.message);
    throw error; // 抛出错误供调用方处理
  }
};

/**
 * 计算两个时间差，格式化为 xdhx 格式（如 5d6h，小于1h显示55m）
 * @param {string|Date|Moment} time1 第一个时间
 * @param {string|Date|Moment} time2 第二个时间
 * @returns {string} 格式化后的时间差
 */
export const formatTimeDiffWithMoment = (time1: string, time2: string) => {
  // 转换为moment对象并计算差值（duration对象）
  const m1 = moment(time1);
  const m2 = moment(time2);
  const diff = moment.duration(m2.diff(m1));

  // 获取绝对值的天、小时、分钟（避免负数）
  const days = Math.abs(diff.days());
  const hours = Math.abs(diff.hours());
  const totalHours = days * 24 + hours; // 总小时数（含天数转换）
  const minutes = Math.abs(diff.minutes());

  // 总分钟数（用于判断是否小于1小时）
  const totalMinutes = totalHours * 60 + minutes;

  // 格式化逻辑
  if (totalMinutes < 60) {
    // 小于1小时：显示分钟
    return `${minutes}m`;
  } else {
    // 大于等于1小时：显示天+小时（仅保留非零的天）
    const parts = [];
    if (days > 0) parts.push(`${days}d`);
    parts.push(`${hours}h`);
    return parts.join('');
  }
};

export const formatNum = (num: number): string => {
  if (num >= 1000000) {
    return (num / 1000000).toFixed(1) + 'M';
  } else if (num >= 1000) {
    return (num / 1000).toFixed(1) + 'k';
  } else {
    return num.toString();
  }
};

/**
 * px换算rem
 * */
export const pxToRem = (px: number) => {
  const designWidth = 393; //设计稿宽度
  const rootValue = 39.3; // 设计稿宽度的 1/10（假设设计稿宽度为 375px，则 375/10=37.5）,
  const maxWidthView = 750; // 限制最大宽度（如超过 750px 按 750px 计算，避免平板上过大）
  // 计算根字体大小：屏幕宽度 / 设计稿宽度 * rootValue
  const screenWidth = document.documentElement.clientWidth || window.innerWidth;
  const actualWidth = Math.min(screenWidth, maxWidthView);
  let rootRem = (actualWidth / designWidth) * rootValue;
  return px / rootRem + 'rem';
};

/**
 * 格式化文件大小显示
 * @param {number} bytes - 文件字节数
 * @returns {string} 格式化后的大小字符串
 */
export const formatFileSize = (bytes: number) => {
  if (bytes < 1024) return `${bytes} B`;
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
  return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
};

/**
 * 释放通过URL.createObjectURL创建的URL
 * @param {string} url - 需要释放的URL
 */
export const revokeImageUrl = (url: string) => {
  if (url) {
    URL.revokeObjectURL(url);
  }
};

// 常见 MIME 类型与扩展名映射表
const mimeToExt: any = {
  'image/jpeg': 'jpg',
  'image/png': 'png',
  'image/gif': 'gif',
  'image/bmp': 'bmp',
  'image/webp': 'webp',
  'image/svg+xml': 'svg',
  'application/pdf': 'pdf',
  'application/zip': 'zip',
  'text/plain': 'txt',
  'application/json': 'json',
};

/**
 * Blob 转换为 File 对象
 * @param {Blob} blob - 原始 Blob 数据
 * @param {string} fileName - 文件名（含扩展名，如 "image.webp"）
 * @returns {File} 转换后的 File 对象
 */
export const blobToFile = (blob: any, fileName?: any) => {
  // File 是 Blob 的子类，可直接通过构造函数转换
  if (!fileName) {
    fileName = `${Date.now()}.${mimeToExt[blob?.type || 'image/png']}`;
  }
  return new File([blob], fileName, {
    type: blob.type, // 继承 Blob 的 MIME 类型
    lastModified: Date.now(), // 最后修改时间设为当前时间
  });
};

// 判断是否为 iOS 设备
export const isIOS =
  /iphone|ipad|ipod|macintosh/.test(navigator.userAgent.toLowerCase()) && 'ontouchend' in document;
